<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Profiler (Programmierung)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Profiler_(Programmierung)"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Profiler_Programmierung rootpage-Profiler_Programmierung skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Profiler (Programmierung)</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p>Als <b>Profiler</b> werden <a href="Programmierwerkzeug" title="Programmierwerkzeug">Programmierwerkzeuge</a> bezeichnet, die das <a href="Laufzeit_(Informatik)" title="Laufzeit (Informatik)">Laufzeitverhalten</a> von Software analysieren. Es gibt unterschiedliche Problembereiche in der Softwareentwicklung, die durch <a href="Effizienz_(Informatik)" title="Effizienz (Informatik)">ineffiziente</a> Programmierung ausgelöst werden. Ein Profiler hilft dem Entwickler, die Problembereiche durch Analyse und Vergleich von laufenden <a href="Computerprogramm" title="Computerprogramm">Programmen</a> aufzudecken. Daraus kann man Maßnahmen zur strukturellen und algorithmischen Verbesserung des Quellcodes ableiten.
</p>
<div class="mw-heading mw-heading2"><h2 id="Bereiche_des_Profilings">Bereiche des Profilings</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Messen_von_Geschwindigkeit">Messen von Geschwindigkeit</h3></div>
<p>Die häufigste Anwendung eines Profilers ist das Zählen und Messen der Aufrufe und Durchläufe von <a href="Funktion_(Programmierung)" title="Funktion (Programmierung)">Funktionen</a>. Dies ermöglicht es dem Programmierer herauszufinden, wo sich eine <a href="Optimierung" class="mw-redirect" title="Optimierung">Optimierung</a> des Programms lohnt. Eine Optimierung von Funktionen, die nicht häufig verwendet werden, ist der Gesamtleistung des Programms nicht sonderlich zuträglich und erschwert in der Regel die Wartbarkeit des Quellcodes. Deshalb wird das Hauptaugenmerk auf Funktionen gelegt, die oft aufgerufen werden und in der Summe der Aufrufe viel Zeit benötigen.
</p>
<div class="mw-heading mw-heading3"><h3 id="Speichernutzung">Speichernutzung</h3></div>
<p>Ein weiterer Aspekt ist die Verfolgung von Speichernutzung durch ein Programm. Der Profiler soll dabei helfen, den Ge- und Verbrauch von <a href="Arbeitsspeicher" title="Arbeitsspeicher">Arbeitsspeicher</a> zu optimieren und ggf. Fehler in der Programmierung aufzudecken, durch die ungenutzte Speicherbereiche nicht freigegeben werden (<a href="Speicherleck" title="Speicherleck">Speicherleck</a>).
</p>
<div class="mw-heading mw-heading3"><h3 id="Nebenläufigkeit"><span id="Nebenl.C3.A4ufigkeit"></span>Nebenläufigkeit</h3></div>
<p>Moderne Profiler bieten die Möglichkeit, nebenläufige Prozesse (<a href="Multithreading" title="Multithreading">Threads</a>) in ihrem Lebenszyklus grafisch (zum Beispiel als <a href="Balkendiagramm" class="mw-redirect" title="Balkendiagramm">Balken-</a> oder <a href="Netzplantechnik" title="Netzplantechnik">Netzdiagramm</a>) darzustellen. Diese optische Aufbereitung soll einem Programmierer helfen, das Laufzeitverhalten von nebenläufigen Prozessen besser zu interpretieren und Fehler durch <a href="Verklemmung" class="mw-redirect" title="Verklemmung">Verklemmung</a> (<span lang="en">Deadlock</span>) aufzudecken.
</p>
<div class="mw-heading mw-heading2"><h2 id="Technische_Aspekte_des_Profilings">Technische Aspekte des Profilings</h2></div>
<p>Das Profiling eines Programms selbst verursacht in der Regel eine Beeinflussung der zu analysierenden Anwendung. Üblicherweise verlangsamt der Profiler selbst die Ausführungsgeschwindigkeit. Außerdem entsteht bei Analysen von großen Programmen eine sehr große Menge an Daten. Es gibt unterschiedliche Techniken beim Profiling, die eine solche Beeinflussung, ggf. unter Verlust der Analysegenauigkeit, verschieden stark ausprägen. Außerdem ermöglichen die Profiler, zu bestimmen, welche Programmteile überhaupt analysiert werden sollen.
</p>
<div class="mw-heading mw-heading3"><h3 id="Statistische_Auswertung">Statistische Auswertung</h3></div>
<p>Mittels der statistischen Auswertung wird die Programmanalyse nicht exakt mit jedem Programmbefehl einer Messung unterzogen. Es wird vielmehr in einem bestimmten zeitlichen Zyklus die Laufzeit gemessen. Dieses Verfahren nennt man auch Sampling. Der Profiler greift damit in bestimmten Taktzyklenabständen in den Programmablauf ein und ermittelt damit stichprobenartig, welche Programmteile seit dem letzten Zyklus aufgerufen wurden. Daraus wird ein statistischer Mittelwert errechnet, der in das Ergebnis der Analyse einfließt.
</p><p>Bei der statistischen Auswertung wird das laufende Programm nicht verändert.
</p>
<div class="mw-heading mw-heading3"><h3 id="Instrumentierung">Instrumentierung</h3></div>
<p>Mit der <a href="Instrumentierung_(Softwareentwicklung)" title="Instrumentierung (Softwareentwicklung)">Instrumentierung</a> werden vom Anwender bestimmte (oder gar alle) Programmabschnitte (zum Beispiel während der Laufzeit) mit Analysecode erweitert. Das heißt, es werden in das Programm Unterbrechungs-Marken (<a href="Interrupt" title="Interrupt">Interrupts</a>) oder Programmcode eingefügt, die dem Profiler während des Programmlaufs signalisieren, dass der Abschnitt gerade abgearbeitet wird. Die Zeit zwischen den Aufrufen der Analysepunkte (sowie das Speicherverhalten als Differenz zu einem vorherigen Durchlauf) können wieder als Laufzeitwerte in das Ergebnis der Analyse einfließen.
</p><p>Die Instrumentierung verändert also das Programm, um die Analysedaten zu berechnen.
</p><p>Es gibt verschiedene Typen der Instrumentierung:
</p>
<ul><li>Manuelle Instrumentierung durch Erweiterung des Quelltextes durch Befehle, die die Laufzeit berechnen (z. B. mit der <a href="Programmierschnittstelle" title="Programmierschnittstelle">Programmierschnittstelle</a> des <a href="Application_Response_Measurement" title="Application Response Measurement">Application-Response-Measurement</a>-Standards).</li>
<li>Durch Compiler-Optionen erweiterte Programme, die dadurch Profiler-Marken erhalten.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup></li>
<li>Nachträgliche Veränderung von kompilierten Programmen durch Einfügen von Marken.</li>
<li>Laufzeit-Instrumentierung: Dabei bleibt das gespeicherte Programm unangetastet. Die Profiler-Marken werden vor dem Ausführen im Arbeitsspeicher hinzugefügt.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Profil-Abbilder">Profil-Abbilder</h2></div>
<p>Ziel einer Programmanalyse ist ein effizientes Laufzeitverhalten der Anwendung. Damit ein Vergleich auch objektiv gelingt, ermöglichen viele Profiler das Speichern und Vergleichen der gesammelten Analysedaten. Somit können Programmänderungen in ihrem Laufzeitverhalten verglichen und bewertet werden. Die Profiler zeigen die Vergleichswerte üblicherweise relativ als Prozentangaben oder als absolute Werte an. Da aber ein Profiler das Laufzeitverhalten während der Analyse immer selbst beeinträchtigt, dürfen solche Vergleichswerte nicht als tatsächliche Veränderung betrachtet werden.
</p>
<div class="mw-heading mw-heading2"><h2 id="Software">Software</h2></div>
<ul><li><a href="GNU_Binutils" title="GNU Binutils">gprof</a></li>
<li>PerfTools</li>
<li>Der <a href="Prozess-Scheduler" title="Prozess-Scheduler">Prozess-Scheduler</a> Slurm besitzt ebenfalls Profiling-Möglichkeiten.</li>
<li><a rel="nofollow" class="external text" href="https://www.prodelphi.de">ProDelphi</a> ist ein Profiler für Delphi (Objekt-Pascal)</li>
<li><a rel="nofollow" class="external text" href="https://www.prodelphi.de">ProLaza</a> ist ein Profiler für Lazarus (Objekt-Pascal)</li>
<li>CODESYS Profiler ist für IEC 61131-3 Code (z. B. Strukturierter Text) entwickelt mit <a href="Codesys" title="Codesys">CODESYS</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Siehe_auch">Siehe auch</h2></div>
<ul><li><a href="Statische_Code-Analyse" title="Statische Code-Analyse">Statische Code-Analyse</a></li>
<li><a href="Style_Checker" title="Style Checker">Style Checker</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Code-Gen-Options.html#index-finstrument-functions-2819">gcc/g++ -finstrument-functions Compiler-Option</a> gcc.gnu.org, abgerufen am 22. Januar 2016.</span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2024-06-03" href="https://de.wikipedia.org/wiki/?title=Profiler_(Programmierung)&oldid=245607156">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>